1 Exploratory Data Analysis III

1.1 Importing Public Data, WDI

1.1.1 Reviews and Previews

library(tidyverse)
library(gapminder)
library(maps)
library(WDI)

(df <- gapminder)

asean <- c("Brunei", "Cambodia", "Laos", "Myanmar", "Philippines", "Indonesia", "Malaysia", "Singapore")
df %>% filter(country %in% asean) %>%
  ggplot(aes(x = year, y = gdpPercap, col = country)) + geom_line()

df %>% filter(country %in% asean) %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, col = country)) + geom_point()

df %>% filter(country %in% asean) %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, col = country)) + 
  geom_point() + coord_trans(x = "log10", y = "identity")

\(\log_{10}{100}\) = 2, \(\log_{10}{1000}\) = 3, \(\log_{10}{10000}\) = 4

\(10^{2.5}\) = 316.227766, \(10^{3}\) = 1000, \(10^{3.5}\) = 3162.2776602,

\(10^{4}\) = 10^{4}, \(10^{4.5}\) = 3.1622777^{4}.




1.1.1.1 World Bank: World Development Indicators (WDI)

  • SP.DYN.LE00.IN: Life expectancy at birth, total (years)
  • NY.GDP.PCAP.KD: GDP per capita (constant 2015 US$)
  • SP.POP.TOTL: Population, total
df_wdi <- WDI(
  country = "all", 
  indicator = c(lifeExp = "SP.DYN.LE00.IN", pop = "SP.POP.TOTL", gdpPercap = "NY.GDP.PCAP.KD")
)

df_wdi

df_wdi_extra <- WDI(
  country = "all", 
  indicator = c(lifeExp = "SP.DYN.LE00.IN", pop = "SP.POP.TOTL", gdpPercap = "NY.GDP.PCAP.KD"), 
  extra = TRUE
)

df_wdi_extra

1.1.2 Exploratory Data Analysis

1.1.2.1 What is EDA (Posit Primers: Visualise Data)

  1. EDA is an iterative cycle that helps you understand what your data says. When you do EDA, you:

  2. Generate questions about your data

  3. Search for answers by visualising, transforming, and/or modeling your data

Use what you learn to refine your questions and/or generate new questions

EDA is an important part of any data analysis. You can use EDA to make discoveries about the world; or you can use EDA to ensure the quality of your data, asking questions about whether the data meets your standards or not.


1.1.3 Open and Public Data, World Bank

1.1.3.1 Open Government Data Toolkit: Open Data Defined

The term ``Open Data’’ has a very precise meaning. Data or content is open if anyone is free to use, re-use or redistribute it, subject at most to measures that preserve provenance and openness.

  1. The data must be , which means they must be placed in the public domain or under liberal terms of use with minimal restrictions.
  2. The data must be , which means they must be published in electronic formats that are machine readable and non-proprietary, so that anyone can access and use the data using common, freely available software tools. Data must also be publicly available and accessible on a public server, without password or firewall restrictions. To make Open Data easier to find, most organizations create and manage Open Data catalogs.

1.1.4 World Bank: WDI - World Development Indicaters

  • World Bank: https://www.worldbank.org
  • Who we are:
    • To end extreme poverty: By reducing the share of the global population that lives in extreme poverty to 3 percent by 2030.
    • To promote shared prosperity: By increasing the incomes of the poorest 40 percent of people in every country.
  • World Bank Open Data: https://data.worldbank.org
    • Data Bank, World Development Indicators, etc.
  • World Development Indicators (WDI) : the World Bank’s premier compilation of cross-country comparable data on development; 1400 time series indicators
    • Themes: Poverty and Inequality, People, Environment, Economy, States and Markets, Global Links
    • Open Data & DataBank: Explore data, Query database
    • Bulk Download: Excel, CSV
    • API Documentation

1.1.5 R Package WDI

  • WDI: World Development Indicators and Other World Bank Data
  • Search and download data from over 40 databases hosted by the World Bank, including the World Development Indicators (‘WDI’), International Debt Statistics, Doing Business, Human Capital Index, and Sub-national Poverty indicators.
  • Version: 2.7.4
  • Materials: README - usage
    • NEWS - version history
  • Published: 2021-04-06
  • README: https://cran.r-project.org/web/packages/WDI/readme/README.html
  • Reference manual: WDI.pdf

1.1.6 Function WDI

  • Usage
WDI(country = "all",
    indicator = "NY.GDP.PCAP.KD",
    start = 1960,
    end = 2020,
    extra = FALSE,
    cache = NULL)
  • Arguments See Help!
    • country: Vector of countries (ISO-2 character codes, e.g. “BR”, “US”, “CA”, or “all”)
    • indicator: If you supply a named vector, the indicators will be automatically renamed: c('women_private_sector' = 'BI.PWK.PRVS.FE.ZS')

1.1.7 Function WDIsearch

library(WDI)
WDIsearch(string = "NY.GDP.PCAP.KD", 
          field = "indicator", cache = NULL)

WDIsearch(string = "population", 
          field = "name", short=FALSE, cache = wdi_cache)

WDIsearch(string = "NY.GDP.PCAP.KD", 
  field = "indicator", short = FALSE, cache = NULL)
WDIsearch(string = "gdp", 
  field = "name", short = TRUE, cache = NULL) 

1.1.8 Use cash

WDIbulk downloads the zip file of Bulk Downloads in WDI site , it is a list containing 6 data frames: Data, Country, Series, Country-Series, Series-Time, FootNote.

timeout: integer maximum number of seconds to wait for download

wdi <- WDIbulk(timeout = 600)

1.1.8.1 Bulk Downloads: Data

wdi$Data  

1.1.8.2 Bulk Downloads: Country

wdi$Country  

1.1.8.3 Bulk Downloads: Series

wdi$Series 

1.1.8.4 Bulk Downloads: Country-Series

wdi$`Country-Series`  

1.1.8.5 Bulk Downloads: Series-Time

wdi$`Series-Time`  

1.1.8.6 Bulk Downloads: Footnote

wdi$FootNote 

1.1.9 WDIcache

Download an updated list of available WDI indicators from the World Bank website. Returns a list for use in the WDIsearch function.

wdi_cache <- WDIcache()

Downloading all series information from the World Bank website can take time. The WDI package ships with a local data object with information on all the series available on 2012-06-18. You can update this database by retrieving a new list using WDIcache, and then feeding the resulting object to WDIsearch via the cache argument.


wdi_cache

1.1.10 WDI_data

List of 2 data frames

The first character matrix includes a full list of WDI series. This list is updated semi-regularly. Users can refresh the list manually using the ‘WDIcache()’ function and search in the updated list using the ‘cache’ argument.

glimpse(WDI_data)

WDI_data$series

WDI_data$country
WDI_data$country  %>% filter(country == "Japan")

WDIsearch(string = "gdp", 
  field = "name", short = FALSE, cache = wdi_cache) 

1.1.11 World Development Indicators - Summary

Find indicators:

  1. WDIsearch(string = "gdp", field = "name", short = FALSE, cache = NULL)
  2. WDI: Data Themes
  3. Browse by Indicators: https://data.worldbank.org/indicator
    • Featured Indicators or All Indicators
    • Obtain the indicator from the detail or the URL

Indicator: EN.ATM.CO2E.PC


co2pcap <- WDI(country = "all", indicator = "EN.ATM.CO2E.PC", start = 1960, end = NULL, extra = TRUE, cache = wdi_cache)
co2pcap


1.1.12 readr, readxl

readr, ggplot2; Public Data, WDI, WIR, etc

1.2 Data Visualization and `ggplot2’

1.2.1 Learning Resouces

  • Posit Primers:
    • Visualize Data: Learn how to use ggplot2 to make any type of plot with your data. Then learn the best ways to visualize patterns within values and relationships between variables.
  • r4ds: Explore, II

1.2.2 Exploratory Data Analysis

1.2.2.1 What is EDA?

EDA is an iterative cycle that helps you understand what your data says. When you do EDA, you:

  1. Generate questions about your data

  2. Search for answers by visualising, transforming, and/or modeling your data

  3. Use what you learn to refine your questions and/or generate new questions

EDA is an important part of any data analysis. You can use EDA to make discoveries about the world; or you can use EDA to ensure the quality of your data, asking questions about whether the data meets your standards or not.

1.2.2.2 Two useful questions

There is no rule about which questions you should ask to guide your research. However, two types of questions will always be useful for making discoveries within your data. You can loosely word these questions as:

  1. What type of variation occurs within my variables?
  2. What type of covariation occurs between my variables?

The rest of this tutorial will look at these two questions. To make the discussion easier, let’s define some terms…

1.2.3 Data Visualization

1.2.4 ggplot2 Basics

visualization

1.2.5 World Inequility Report

1.2.6 ggplot2 Extra

LS0tCnRpdGxlOiAnV29ybGQgTWFwJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICBiZWFtZXJfcHJlc2VudGF0aW9uOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OgogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICBpb3NsaWRlc19wcmVzZW50YXRpb246IAogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB3aWRlc2NyZWVuOiB5ZXMKLS0tCgoKIyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzIElJSSAgCgojIyBJbXBvcnRpbmcgUHVibGljIERhdGEsIFdESQoKIyMjIFJldmlld3MgYW5kIFByZXZpZXdzCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnYXBtaW5kZXIpCmxpYnJhcnkobWFwcykKbGlicmFyeShXREkpCmBgYAoKLS0tCgpgYGB7cn0KKGRmIDwtIGdhcG1pbmRlcikKYGBgCgotLS0KCmBgYHtyfQphc2VhbiA8LSBjKCJCcnVuZWkiLCAiQ2FtYm9kaWEiLCAiTGFvcyIsICJNeWFubWFyIiwgIlBoaWxpcHBpbmVzIiwgIkluZG9uZXNpYSIsICJNYWxheXNpYSIsICJTaW5nYXBvcmUiKQpkZiAlPiUgZmlsdGVyKGNvdW50cnkgJWluJSBhc2VhbikgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcFBlcmNhcCwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgotLS0KYGBge3J9CmRmICU+JSBmaWx0ZXIoY291bnRyeSAlaW4lIGFzZWFuKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBnZHBQZXJjYXAsIHkgPSBsaWZlRXhwLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX3BvaW50KCkKYGBgCgotLS0KCmBgYHtyfQpkZiAlPiUgZmlsdGVyKGNvdW50cnkgJWluJSBhc2VhbikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZ2RwUGVyY2FwLCB5ID0gbGlmZUV4cCwgY29sID0gY291bnRyeSkpICsgCiAgZ2VvbV9wb2ludCgpICsgY29vcmRfdHJhbnMoeCA9ICJsb2cxMCIsIHkgPSAiaWRlbnRpdHkiKQpgYGAKJFxsb2dfezEwfXsxMDB9JCA9IGByIGxvZzEwKDEwMClgLCAkXGxvZ197MTB9ezEwMDB9JCA9IGByIGxvZzEwKDEwMDApYCwgJFxsb2dfezEwfXsxMDAwMH0kID0gYHIgbG9nMTAoMTAwMDApYAoKJDEwXnsyLjV9JCA9IGByIHNxcnQoMTApXns1fWAsICQxMF57M30kID0gYHIgMTBeezN9YCwgJDEwXnszLjV9JCA9IGByIHNxcnQoMTApXjdgLCAKCiQxMF57NH0kID0gYHIgMTBeNGAsICQxMF57NC41fSQgPSBgciBzcXJ0KDEwKV45YC4KCi0tLQoKYGBge3IgZWNobz1GQUxTRX0KbGlicmFyeShnZ3JlcGVsKQpkZjIwMDcgPC0gZGYgJT4lIGZpbHRlcihjb3VudHJ5ICVpbiUgYXNlYW4sIHllYXIgPT0gMjAwNykKZGYgJT4lIGZpbHRlcihjb3VudHJ5ICVpbiUgYXNlYW4pICU+JQogIGdncGxvdChhZXMoeCA9IGdkcFBlcmNhcCwgeSA9IGxpZmVFeHAsIGNvbCA9IGNvdW50cnkpKSsgCiAgZ2VvbV9saW5lKCkgKyBnZW9tX2xhYmVsX3JlcGVsKGRhdGEgPSBkZjIwMDcsIGFlcyhsYWJlbCA9IGNvdW50cnkpKSArIGdlb21fcG9pbnQoKSAgKwogIGNvb3JkX3RyYW5zKHggPSAibG9nMTAiLCB5ID0gImlkZW50aXR5IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMSwgaGp1c3Q9MSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiTGlmZSBFeHBlY3RhbmN5IHZzIEdEUCBQZXIgQ2FwaXRhIG9mIEFTRUFOIENvdW50cmllcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRhOiBnYXBtaW5kZXIgcGFja2FnZSIsIHggPSAiR0RQIHBlciBDYXBpdGEiLCB5ID0gIkxpZmUgRXhwZWN0YW5jeSIpCmBgYAoKLS0tCgpgYGB7ciBlY2hvPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShtYXBzKQp3b3JsZF9tYXAgPC0gbWFwX2RhdGEoIndvcmxkIikKZGYgJT4lCiAgZ2dwbG90KGFlcyhtYXBfaWQgPSBjb3VudHJ5KSkgKyAKICBnZW9tX21hcChhZXMoZmlsbCA9IGdkcFBlcmNhcCksIG1hcCA9IHdvcmxkX21hcCkgKyBleHBhbmRfbGltaXRzKHggPSB3b3JsZF9tYXAkbG9uZywgeSA9IHdvcmxkX21hcCRsYXQpICsKICBsYWJzKHRpdGxlID0gIkdhcG1pbmRlciBQYWNrYWdlIERhdGEiLCBzdWJ0aXRsZT0iV29ybGQgTWFwIG9mIEdEUCBwZXIgQ2FwaXRhIERhdGEiKQpgYGAKCi0tLQoKIyMjIyBXb3JsZCBCYW5rOiBXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzIChXREkpCgoqIFNQLkRZTi5MRTAwLklOOiBMaWZlIGV4cGVjdGFuY3kgYXQgYmlydGgsIHRvdGFsICh5ZWFycykKKiBOWS5HRFAuUENBUC5LRDogR0RQIHBlciBjYXBpdGEgKGNvbnN0YW50IDIwMTUgVVMkKQoqIFNQLlBPUC5UT1RMOiBQb3B1bGF0aW9uLCB0b3RhbAoKYGBge3IgY2FzaD1UUlVFfQpkZl93ZGkgPC0gV0RJKAogIGNvdW50cnkgPSAiYWxsIiwgCiAgaW5kaWNhdG9yID0gYyhsaWZlRXhwID0gIlNQLkRZTi5MRTAwLklOIiwgcG9wID0gIlNQLlBPUC5UT1RMIiwgZ2RwUGVyY2FwID0gIk5ZLkdEUC5QQ0FQLktEIikKKQpgYGAKCi0tLQoKYGBge3J9CmRmX3dkaQpgYGAKCi0tLQoKYGBge3IgY2FzaD1UUlVFfQpkZl93ZGlfZXh0cmEgPC0gV0RJKAogIGNvdW50cnkgPSAiYWxsIiwgCiAgaW5kaWNhdG9yID0gYyhsaWZlRXhwID0gIlNQLkRZTi5MRTAwLklOIiwgcG9wID0gIlNQLlBPUC5UT1RMIiwgZ2RwUGVyY2FwID0gIk5ZLkdEUC5QQ0FQLktEIiksIAogIGV4dHJhID0gVFJVRQopCmBgYAoKLS0tCgpgYGB7cn0KZGZfd2RpX2V4dHJhCmBgYAoKCi0tLQoKIyMjIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMKCiMjIyMgV2hhdCBpcyBFREEgKFBvc2l0IFByaW1lcnM6IFtWaXN1YWxpc2UgRGF0YV0oaHR0cHM6Ly9wb3NpdC5jbG91ZC9sZWFybi9wcmltZXJzLzMuMSkpCgoxLiBFREEgaXMgYW4gaXRlcmF0aXZlIGN5Y2xlIHRoYXQgaGVscHMgeW91IHVuZGVyc3RhbmQgd2hhdCB5b3VyIGRhdGEgc2F5cy4gV2hlbiB5b3UgZG8gRURBLCB5b3U6CgoyLiBHZW5lcmF0ZSBxdWVzdGlvbnMgYWJvdXQgeW91ciBkYXRhCgozLiBTZWFyY2ggZm9yIGFuc3dlcnMgYnkgdmlzdWFsaXNpbmcsIHRyYW5zZm9ybWluZywgYW5kL29yIG1vZGVsaW5nIHlvdXIgZGF0YQoKVXNlIHdoYXQgeW91IGxlYXJuIHRvIHJlZmluZSB5b3VyIHF1ZXN0aW9ucyBhbmQvb3IgZ2VuZXJhdGUgbmV3IHF1ZXN0aW9ucwoKRURBIGlzIGFuIGltcG9ydGFudCBwYXJ0IG9mIGFueSBkYXRhIGFuYWx5c2lzLiBZb3UgY2FuIHVzZSBFREEgdG8gbWFrZSBkaXNjb3ZlcmllcyBhYm91dCB0aGUgd29ybGQ7IG9yIHlvdSBjYW4gdXNlIEVEQSB0byBlbnN1cmUgdGhlIHF1YWxpdHkgb2YgeW91ciBkYXRhLCBhc2tpbmcgcXVlc3Rpb25zIGFib3V0IHdoZXRoZXIgdGhlIGRhdGEgbWVldHMgeW91ciBzdGFuZGFyZHMgb3Igbm90LgoKLS0tCgojIyMgT3BlbiBhbmQgUHVibGljIERhdGEsIFdvcmxkIEJhbmsKCiMjIyMgW09wZW4gR292ZXJubWVudCBEYXRhIFRvb2xraXRdKGh0dHA6Ly9vcGVuZGF0YXRvb2xraXQud29ybGRiYW5rLm9yZyk6IFtPcGVuIERhdGEgRGVmaW5lZF0oaHR0cDovL29wZW5kYXRhdG9vbGtpdC53b3JsZGJhbmsub3JnL2VuL2Vzc2VudGlhbHMuaHRtbCkKClRoZSB0ZXJtIGBgT3BlbiBEYXRhJycgaGFzIGEgdmVyeSBwcmVjaXNlIG1lYW5pbmcuIERhdGEgb3IgY29udGVudCBpcyBvcGVuIGlmIGFueW9uZSBpcyBmcmVlIHRvIHVzZSwgcmUtdXNlIG9yIHJlZGlzdHJpYnV0ZSBpdCwgc3ViamVjdCBhdCBtb3N0IHRvIG1lYXN1cmVzIHRoYXQgcHJlc2VydmUgcHJvdmVuYW5jZSBhbmQgb3Blbm5lc3MuCgoxLiBUaGUgZGF0YSBtdXN0IGJlIFx1bmRlcmxpbmV7bGVnYWxseSBvcGVufSwgd2hpY2ggbWVhbnMgdGhleSBtdXN0IGJlIHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbiBvciB1bmRlciBsaWJlcmFsIHRlcm1zIG9mIHVzZSB3aXRoIG1pbmltYWwgcmVzdHJpY3Rpb25zLgoyLiBUaGUgZGF0YSBtdXN0IGJlIFx1bmRlcmxpbmV7dGVjaG5pY2FsbHkgb3Blbn0sIHdoaWNoIG1lYW5zIHRoZXkgbXVzdCBiZSBwdWJsaXNoZWQgaW4gZWxlY3Ryb25pYyBmb3JtYXRzIHRoYXQgYXJlIG1hY2hpbmUgcmVhZGFibGUgYW5kIG5vbi1wcm9wcmlldGFyeSwgc28gdGhhdCBhbnlvbmUgY2FuIGFjY2VzcyBhbmQgdXNlIHRoZSBkYXRhIHVzaW5nIGNvbW1vbiwgZnJlZWx5IGF2YWlsYWJsZSBzb2Z0d2FyZSB0b29scy4gRGF0YSBtdXN0IGFsc28gYmUgcHVibGljbHkgYXZhaWxhYmxlIGFuZCBhY2Nlc3NpYmxlIG9uIGEgcHVibGljIHNlcnZlciwgd2l0aG91dCBwYXNzd29yZCBvciBmaXJld2FsbCByZXN0cmljdGlvbnMuIFRvIG1ha2UgT3BlbiBEYXRhIGVhc2llciB0byBmaW5kLCBtb3N0IG9yZ2FuaXphdGlvbnMgY3JlYXRlIGFuZCBtYW5hZ2UgT3BlbiBEYXRhIGNhdGFsb2dzLgoKLS0tCgojIyMgV29ybGQgQmFuazogV0RJIC0gV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdGVycwoKKiBXb3JsZCBCYW5rOiBodHRwczovL3d3dy53b3JsZGJhbmsub3JnCiogW1dobyB3ZSBhcmVdKGh0dHBzOi8vd3d3LndvcmxkYmFuay5vcmcvZW4vd2hvLXdlLWFyZSk6CiAgLSBUbyBlbmQgZXh0cmVtZSBwb3ZlcnR5OiBCeSByZWR1Y2luZyB0aGUgc2hhcmUgb2YgdGhlIGdsb2JhbCBwb3B1bGF0aW9uIHRoYXQgbGl2ZXMgaW4gZXh0cmVtZSBwb3ZlcnR5IHRvIDMgcGVyY2VudCBieSAyMDMwLgogIC0gVG8gcHJvbW90ZSBzaGFyZWQgcHJvc3Blcml0eTogQnkgaW5jcmVhc2luZyB0aGUgaW5jb21lcyBvZiB0aGUgcG9vcmVzdCA0MCBwZXJjZW50IG9mIHBlb3BsZSBpbiBldmVyeSBjb3VudHJ5LiAKKiBXb3JsZCBCYW5rIE9wZW4gRGF0YTogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcKICAtIERhdGEgQmFuaywgV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9ycywgZXRjLgoqIFtXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzIChXREkpXShodHRwczovL2RhdGF0b3BpY3Mud29ybGRiYW5rLm9yZy93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzLykgOiB0aGUgV29ybGQgQmFua+KAmXMgcHJlbWllciBjb21waWxhdGlvbiBvZiBjcm9zcy1jb3VudHJ5IGNvbXBhcmFibGUgZGF0YSBvbiBkZXZlbG9wbWVudDsgMTQwMCB0aW1lIHNlcmllcyBpbmRpY2F0b3JzCiAgLSBUaGVtZXM6IFBvdmVydHkgYW5kIEluZXF1YWxpdHksIFBlb3BsZSwgRW52aXJvbm1lbnQsIEVjb25vbXksIFN0YXRlcyBhbmQgTWFya2V0cywgR2xvYmFsIExpbmtzCiAgLSBPcGVuIERhdGEgJiBEYXRhQmFuazogRXhwbG9yZSBkYXRhLCBRdWVyeSBkYXRhYmFzZQogIC0gQnVsayBEb3dubG9hZDogRXhjZWwsIENTVgogIC0gQVBJIERvY3VtZW50YXRpb24KICAKLS0tCgojIyMgUiBQYWNrYWdlIFtXREldKGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9V0RJKQoKKiBbV0RJXShodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPVdESSk6IFdvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnMgYW5kIE90aGVyIFdvcmxkIEJhbmsgRGF0YQoqIFNlYXJjaCBhbmQgZG93bmxvYWQgZGF0YSBmcm9tIG92ZXIgNDAgZGF0YWJhc2VzIGhvc3RlZCBieSB0aGUgV29ybGQgQmFuaywgaW5jbHVkaW5nIHRoZSBXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzICgnV0RJJyksIEludGVybmF0aW9uYWwgRGVidCBTdGF0aXN0aWNzLCBEb2luZyBCdXNpbmVzcywgSHVtYW4gQ2FwaXRhbCBJbmRleCwgYW5kIFN1Yi1uYXRpb25hbCBQb3ZlcnR5IGluZGljYXRvcnMuCiogVmVyc2lvbjogMi43LjQKKiBNYXRlcmlhbHM6CVtSRUFETUVdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9XREkvcmVhZG1lL1JFQURNRS5odG1sKSAgIC0gX3VzYWdlXwogIC0gW05FV1NdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9XREkvbmV3cy9uZXdzLmh0bWwpIC0gX3ZlcnNpb24gaGlzdG9yeV8KKiBQdWJsaXNoZWQ6IDIwMjEtMDQtMDYKKiBSRUFETUU6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9XREkvcmVhZG1lL1JFQURNRS5odG1sCiogUmVmZXJlbmNlIG1hbnVhbDoJW1dESS5wZGZdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9XREkvV0RJLnBkZikKCi0tLQoKIyMjIEZ1bmN0aW9uIFdESQoKKiAqKlVzYWdlKioKCmBgYApXREkoY291bnRyeSA9ICJhbGwiLAogICAgaW5kaWNhdG9yID0gIk5ZLkdEUC5QQ0FQLktEIiwKICAgIHN0YXJ0ID0gMTk2MCwKICAgIGVuZCA9IDIwMjAsCiAgICBleHRyYSA9IEZBTFNFLAogICAgY2FjaGUgPSBOVUxMKQpgYGAKCiogKipBcmd1bWVudHMqKiBTZWUgSGVscCEKICAtIGNvdW50cnk6IFZlY3RvciBvZiBjb3VudHJpZXMgKElTTy0yIGNoYXJhY3RlciBjb2RlcywgZS5nLiAiQlIiLCAiVVMiLCAiQ0EiLCBvciAiYWxsIikgCiAgLSBpbmRpY2F0b3I6IElmIHlvdSBzdXBwbHkgYSBuYW1lZCB2ZWN0b3IsIHRoZSBpbmRpY2F0b3JzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZW5hbWVkOiBgYygnd29tZW5fcHJpdmF0ZV9zZWN0b3InID0gJ0JJLlBXSy5QUlZTLkZFLlpTJylgCgotLS0KCiMjIyBGdW5jdGlvbiBXRElzZWFyY2gKCmBgYHtyfQpsaWJyYXJ5KFdESSkKYGBgCmBgYHtyfQpXRElzZWFyY2goc3RyaW5nID0gIk5ZLkdEUC5QQ0FQLktEIiwgCiAgICAgICAgICBmaWVsZCA9ICJpbmRpY2F0b3IiLCBjYWNoZSA9IE5VTEwpCmBgYAoKLS0tCgpgYGB7cn0KV0RJc2VhcmNoKHN0cmluZyA9ICJwb3B1bGF0aW9uIiwgCiAgICAgICAgICBmaWVsZCA9ICJuYW1lIiwgc2hvcnQ9RkFMU0UsIGNhY2hlID0gd2RpX2NhY2hlKQpgYGAKCi0tLQoKYGBgCldESXNlYXJjaChzdHJpbmcgPSAiTlkuR0RQLlBDQVAuS0QiLCAKICBmaWVsZCA9ICJpbmRpY2F0b3IiLCBzaG9ydCA9IEZBTFNFLCBjYWNoZSA9IE5VTEwpCmBgYApgYGAKV0RJc2VhcmNoKHN0cmluZyA9ICJnZHAiLCAKICBmaWVsZCA9ICJuYW1lIiwgc2hvcnQgPSBUUlVFLCBjYWNoZSA9IE5VTEwpIApgYGAKCi0tLQoKIyMjIFVzZSBjYXNoCgpXRElidWxrIGRvd25sb2FkcyB0aGUgemlwIGZpbGUgb2YgQnVsayBEb3dubG9hZHMgaW4gW1dESSBzaXRlXShodHRwczovL2RhdGF0b3BpY3Mud29ybGRiYW5rLm9yZy93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzLykgLCBpdCBpcyBhIGxpc3QgY29udGFpbmluZyA2IGRhdGEgZnJhbWVzOiBEYXRhLCBDb3VudHJ5LCBTZXJpZXMsIENvdW50cnktU2VyaWVzLCBTZXJpZXMtVGltZSwgRm9vdE5vdGUuCgpgdGltZW91dGA6IGludGVnZXIgbWF4aW11bSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBkb3dubG9hZAoKCgpgYGB7ciBjYXNoPVRSVUV9CndkaSA8LSBXRElidWxrKHRpbWVvdXQgPSA2MDApCmBgYAotLS0KCiMjIyMgQnVsayBEb3dubG9hZHM6IERhdGEKCmBgYHtyfQp3ZGkkRGF0YSAgCmBgYAoKLS0tCgojIyMjIEJ1bGsgRG93bmxvYWRzOiBDb3VudHJ5CgpgYGB7cn0Kd2RpJENvdW50cnkgIApgYGAKCi0tLQoKIyMjIyBCdWxrIERvd25sb2FkczogU2VyaWVzCgpgYGB7cn0Kd2RpJFNlcmllcyAKYGBgCgotLS0KCiMjIyMgQnVsayBEb3dubG9hZHM6IENvdW50cnktU2VyaWVzCgpgYGB7cn0Kd2RpJGBDb3VudHJ5LVNlcmllc2AgIApgYGAKCi0tLQoKIyMjIyBCdWxrIERvd25sb2FkczogU2VyaWVzLVRpbWUKCmBgYHtyfQp3ZGkkYFNlcmllcy1UaW1lYCAgCmBgYAoKLS0tCgojIyMjIEJ1bGsgRG93bmxvYWRzOiBGb290bm90ZQoKYGBge3J9CndkaSRGb290Tm90ZSAKYGBgCgotLS0KCiMjIyBXREljYWNoZQoKRG93bmxvYWQgYW4gdXBkYXRlZCBsaXN0IG9mIGF2YWlsYWJsZSBXREkgaW5kaWNhdG9ycyBmcm9tIHRoZSBXb3JsZCBCYW5rIHdlYnNpdGUuIFJldHVybnMgYSBsaXN0IGZvciB1c2UgaW4gdGhlIFdESXNlYXJjaCBmdW5jdGlvbi4KCmBgYHtyIGNhc2g9VFJVRX0Kd2RpX2NhY2hlIDwtIFdESWNhY2hlKCkKYGBgCgpEb3dubG9hZGluZyBhbGwgc2VyaWVzIGluZm9ybWF0aW9uIGZyb20gdGhlIFdvcmxkIEJhbmsgd2Vic2l0ZSBjYW4gdGFrZSB0aW1lLiBUaGUgV0RJIHBhY2thZ2Ugc2hpcHMgd2l0aCBhIGxvY2FsIGRhdGEgb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gb24gYWxsIHRoZSBzZXJpZXMgYXZhaWxhYmxlIG9uIDIwMTItMDYtMTguIFlvdSBjYW4gdXBkYXRlIHRoaXMgZGF0YWJhc2UgYnkgcmV0cmlldmluZyBhIG5ldyBsaXN0IHVzaW5nIGBXREljYWNoZWAsIGFuZCB0aGVuIGZlZWRpbmcgdGhlIHJlc3VsdGluZyBvYmplY3QgdG8gYFdESXNlYXJjaGAgdmlhIHRoZSBjYWNoZSBhcmd1bWVudC4KCi0tLQoKYGBge3J9CndkaV9jYWNoZQpgYGAKCgotLS0KCiMjIyBXRElfZGF0YQoKTGlzdCBvZiAyIGRhdGEgZnJhbWVzCgpUaGUgZmlyc3QgY2hhcmFjdGVyIG1hdHJpeCBpbmNsdWRlcyBhIGZ1bGwgbGlzdCBvZiBXREkgc2VyaWVzLiBUaGlzIGxpc3QgaXMgdXBkYXRlZCBzZW1pLXJlZ3VsYXJseS4gVXNlcnMgY2FuIHJlZnJlc2ggdGhlIGxpc3QgbWFudWFsbHkgdXNpbmcgdGhlICdXREljYWNoZSgpJyBmdW5jdGlvbiBhbmQgc2VhcmNoIGluIHRoZSB1cGRhdGVkIGxpc3QgdXNpbmcgdGhlICdjYWNoZScgYXJndW1lbnQuCgoKYGBge3J9CmdsaW1wc2UoV0RJX2RhdGEpCmBgYAoKLS0tCgpgYGB7cn0KV0RJX2RhdGEkc2VyaWVzCmBgYAoKLS0tCgpgYGB7cn0KV0RJX2RhdGEkY291bnRyeQpgYGAKCmBgYHtyfQpXRElfZGF0YSRjb3VudHJ5ICAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikKYGBgCgotLS0KCmBgYHtyfQpXRElzZWFyY2goc3RyaW5nID0gImdkcCIsIAogIGZpZWxkID0gIm5hbWUiLCBzaG9ydCA9IEZBTFNFLCBjYWNoZSA9IHdkaV9jYWNoZSkgCmBgYAoKLS0tCgojIyMgV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9ycyAtIFN1bW1hcnkKCkZpbmQgaW5kaWNhdG9yczoKCjEuIGBXRElzZWFyY2goc3RyaW5nID0gImdkcCIsIGZpZWxkID0gIm5hbWUiLCBzaG9ydCA9IEZBTFNFLCBjYWNoZSA9IE5VTEwpYAoyLiBbV0RJXShodHRwczovL2RhdGF0b3BpY3Mud29ybGRiYW5rLm9yZy93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzLyk6IERhdGEgVGhlbWVzCjMuIEJyb3dzZSBieSBJbmRpY2F0b3JzOiBodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IKICAgLSBGZWF0dXJlZCBJbmRpY2F0b3JzIG9yIEFsbCBJbmRpY2F0b3JzCiAgIC0gT2J0YWluIHRoZSBpbmRpY2F0b3IgZnJvbSB0aGUgZGV0YWlsIG9yIHRoZSBVUkwKCi0tLQoKSW5kaWNhdG9yOiBFTi5BVE0uQ08yRS5QQwoKPGlmcmFtZSBzcmM9Imh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL3NoYXJlL3dpZGdldD9lbmQ9MjAxOSZpbmRpY2F0b3JzPUVOLkFUTS5DTzJFLlBDJmxvY2F0aW9ucz1KUC0xVy1VUy1QSyZzdGFydD0yMDE5JnZpZXc9YmFyJnllYXI9MjAxOSIgd2lkdGg9JzQ1MCcgaGVpZ2h0PSczMDAnIGZyYW1lQm9yZGVyPScwJyBzY3JvbGxpbmc9Im5vIiA+PC9pZnJhbWU+CgotLS0KCmBgYHtyIGNhc2g9VFJVRX0KY28ycGNhcCA8LSBXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSAiRU4uQVRNLkNPMkUuUEMiLCBzdGFydCA9IDE5NjAsIGVuZCA9IE5VTEwsIGV4dHJhID0gVFJVRSwgY2FjaGUgPSB3ZGlfY2FjaGUpCmBgYAoKYGBge3J9CmNvMnBjYXAKYGBgCgotLS0KCjxpZnJhbWUgc3JjPSJodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9zaGFyZS93aWRnZXQ/ZW5kPTIwMjAmaW5kaWNhdG9ycz1TUC5BRE8uVEZSVCZzdGFydD0yMDIwJnZpZXc9bWFwIiB3aWR0aD0nNDUwJyBoZWlnaHQ9JzMwMCcgZnJhbWVCb3JkZXI9JzAnIHNjcm9sbGluZz0ibm8iID48L2lmcmFtZT4KCi0tLQojIyMgYHJlYWRyYCwgYHJlYWR4bGAKCiAgIGByZWFkcmAsIGBnZ3Bsb3QyYDsgUHVibGljIERhdGEsIFdESSwgV0lSLCBldGMKICAgIAojIyBEYXRhIFZpc3VhbGl6YXRpb24gYW5kIGBnZ3Bsb3QyJwoKCiMjIyBMZWFybmluZyBSZXNvdWNlcwoKKiBQb3NpdCBQcmltZXJzOgogIC0gW1Zpc3VhbGl6ZSBEYXRhXShodHRwczovL3Bvc2l0LmNsb3VkL2xlYXJuL3ByaW1lcnMvMyk6IExlYXJuIGhvdyB0byB1c2UgZ2dwbG90MiB0byBtYWtlIGFueSB0eXBlIG9mIHBsb3Qgd2l0aCB5b3VyIGRhdGEuIFRoZW4gbGVhcm4gdGhlIGJlc3Qgd2F5cyB0byB2aXN1YWxpemUgcGF0dGVybnMgd2l0aGluIHZhbHVlcyBhbmQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHZhcmlhYmxlcy4KKiBbcjRkczogRXhwbG9yZSwgSUldKGh0dHBzOi8vcjRkcy5oYWQuY28ubnovZXhwbG9yZS1pbnRyby5odG1sI2V4cGxvcmUtaW50cm8pCgoKIyMjIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMKCiMjIyMgV2hhdCBpcyBFREE/CgpFREEgaXMgYW4gaXRlcmF0aXZlIGN5Y2xlIHRoYXQgaGVscHMgeW91IHVuZGVyc3RhbmQgd2hhdCB5b3VyIGRhdGEgc2F5cy4gV2hlbiB5b3UgZG8gRURBLCB5b3U6CgoxLiBHZW5lcmF0ZSBxdWVzdGlvbnMgYWJvdXQgeW91ciBkYXRhCgoyLiBTZWFyY2ggZm9yIGFuc3dlcnMgYnkgdmlzdWFsaXNpbmcsIHRyYW5zZm9ybWluZywgYW5kL29yIG1vZGVsaW5nIHlvdXIgZGF0YQoKMy4gVXNlIHdoYXQgeW91IGxlYXJuIHRvIHJlZmluZSB5b3VyIHF1ZXN0aW9ucyBhbmQvb3IgZ2VuZXJhdGUgbmV3IHF1ZXN0aW9ucwoKRURBIGlzIGFuIGltcG9ydGFudCBwYXJ0IG9mIGFueSBkYXRhIGFuYWx5c2lzLiBZb3UgY2FuIHVzZSBFREEgdG8gbWFrZSBkaXNjb3ZlcmllcyBhYm91dCB0aGUgd29ybGQ7IG9yIHlvdSBjYW4gdXNlIEVEQSB0byBlbnN1cmUgdGhlIHF1YWxpdHkgb2YgeW91ciBkYXRhLCBhc2tpbmcgcXVlc3Rpb25zIGFib3V0IHdoZXRoZXIgdGhlIGRhdGEgbWVldHMgeW91ciBzdGFuZGFyZHMgb3Igbm90LgoKIyMjIyBUd28gdXNlZnVsIHF1ZXN0aW9ucwoKVGhlcmUgaXMgbm8gcnVsZSBhYm91dCB3aGljaCBxdWVzdGlvbnMgeW91IHNob3VsZCBhc2sgdG8gZ3VpZGUgeW91ciByZXNlYXJjaC4gSG93ZXZlciwgdHdvIHR5cGVzIG9mIHF1ZXN0aW9ucyB3aWxsIGFsd2F5cyBiZSB1c2VmdWwgZm9yIG1ha2luZyBkaXNjb3ZlcmllcyB3aXRoaW4geW91ciBkYXRhLiBZb3UgY2FuIGxvb3NlbHkgd29yZCB0aGVzZSBxdWVzdGlvbnMgYXM6CgoxLiBXaGF0IHR5cGUgb2YgdmFyaWF0aW9uIG9jY3VycyB3aXRoaW4gbXkgdmFyaWFibGVzPwoyLiBXaGF0IHR5cGUgb2YgY292YXJpYXRpb24gb2NjdXJzIGJldHdlZW4gbXkgdmFyaWFibGVzPwoKVGhlIHJlc3Qgb2YgdGhpcyB0dXRvcmlhbCB3aWxsIGxvb2sgYXQgdGhlc2UgdHdvIHF1ZXN0aW9ucy4gVG8gbWFrZSB0aGUgZGlzY3Vzc2lvbiBlYXNpZXIsIGxldOKAmXMgZGVmaW5lIHNvbWUgdGVybXPigKYKCiMjIyBEYXRhIFZpc3VhbGl6YXRpb24KCiMjIyBgZ2dwbG90MmAgQmFzaWNzCgohW3Zpc3VhbGl6YXRpb25dKGRhdGEvdmlzdWFsaXphdGlvbi5wbmcpCgoKCiMjIyBXb3JsZCBJbmVxdWlsaXR5IFJlcG9ydAoKIyMjIGBnZ3Bsb3QyYCBFeHRyYQoKCg==